<!DOCTYPE html>
<html>
<head>
  	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link rel="stylesheet" type="text/css" href="style.css">
	<title>Meeskond Sidi, Tartu &Uuml;likooli Robotiklubi</title>
</head>
<body> 
Sisukord [peida]
1 Meeskond Sidi kokkuv&otilde;te
1.1 Projektijuhtimine
1.2 Disain
1.3 Mehaanika
1.4 Elektroonika
1.4.1 Mootorite Plaat
1.4.2 L&ouml;&ouml;gimehhanismi Plaat
1.4.3 LED-ide ja vooluplaat
1.5 Programmeerimine
1.5.1 R&uuml;peraal (Ordi; Lubuntu)
1.5.2 Arduino
1.5.3 Mootorite Plaat
1.5.4 L&ouml;&ouml;gimehhanismi Plaat
1.6 Mida me Robotexist &otilde;ppisime
1.6.1 Raimond
1.6.2 Marti
1.6.3 Harti
1.6.4 T&otilde;nis
1.7 Soovitusi ja m&otilde;tteid
1.8 Robotex
[redigeeri] Meeskond Sidi kokkuv&otilde;te

K&auml;esolev leht sisaldab &uuml;levaadet 2011nda aasta Robotexiks roboti Robin ehitamise kohta. Samuti meeskonnaliikmete arvamusi ja soovitusi Robini ehitamisest.

Video meeskonna tegemistest ja roboti arengust link
&Uuml;ldist infot roboti komponentide ja t&ouml;&ouml;jaotuste kohta saab vaadata meeskonna &uuml;ldiselt lehek&uuml;ljelt.
Projekti t&ouml;&ouml; toimus l&auml;bi SVN repositooriumi, mida hoidsime Assembla.com portaalis. Avalik repositooriumi aadress on:
https://subversion.assembla.com/svn/sidi/
[redigeeri] Projektijuhtimine

Projektijuhtimisega tegeles Raimond.


T&otilde;nise ja Harti koost&ouml;&ouml; testv&auml;ljaku peal


&Otilde;htul laboris Martiga Skaibis koodi &uuml;le arutamas
Koodi hoidmine ja versioonihaldus toimus assembla.com SVN-is. SVN-i kasutuselev&otilde;tu (eelmine aasta kasutasime Git'i) peamine p&otilde;hjus oli selles, et SVN-il on rohkem klient-rakendusi, millest iga meeskonnaliige v&otilde;is endale sobiva valida, ja SVN on ka natuke rohkem levinum, seega kogemus sellega tuli ilmselt k&otilde;igile kasuks. Assembla.com'i eelistus oli ennek&otilde;ike sellep&auml;rast, et seal pakutakse veebirakendust, kus on v&auml;ga mugav ja ilus vaadata versioonide ajalugu ja tehtud muudatusi. &Uuml;hes&otilde;naga oli v&otilde;imalik kiiresti veebist vaadata eelmistes versioonides olevat koodi ja omada head &uuml;levaadet.
T&ouml;&ouml;protsessi h&otilde;lbustas m&otilde;nev&otilde;rra siin digiwikis olev Tasklist, kuid mitte niipalju kui alguses oli lootust. &Uuml;ldiselt k&otilde;ik teadsid enda olemasolevaid &uuml;lesandeid ning infovahetus oli rohkem telefonitsi. N&auml;iteks elektroonikaprobleemi tekkimise korral sai helistatud Hartile ja ta j&auml;ttis meelde tekkinud mure ning j&auml;rgmisel korral laboris lahendas selle &auml;ra.
Tundus, et rohkem kasu oli blogi pidamisest. Sinna sai ka tekkinud probleeme p&otilde;hjalikult kirjeldatud ning vastavate valdkondade asjaosalised said probleemidest hea &uuml;levaate ning asusid nende kallal tegutsema. Omame arvamust, et blogi pidamine hoiab meeskonda jooksvalt t&ouml;&ouml;protsessiga kursis: annab n&auml;iteks &uuml;levaate, mida isik X eile laboris tegi ja kuhu maani j&otilde;udis. See annab motivatsiooni, kui kellelgi on midagi &otilde;nnestunud; iga&uuml;ks enam-v&auml;hem teab, millega teised tegelevad; probleemide tekkimise korral on abi andmine selgem.
Suureks suhtluskanaliks osutus peale telefoni ka Skype, mille l&auml;bi sai n&auml;iteks Martiga tekkinud probleeme lahendada v&otilde;i laboris olevate meeskonnakaaslastega kiiresti infot vahetada. V&auml;ga suureks abiks oli ka TeamViewer, mille abil sai Marti juhtida roboti r&uuml;peraali ja selle peal ise Tallinnas olles vigu parandada.
Suuremamahulisi faile nagu videoid ja tooreid 3D-mudeli faile hoidsime DropBoxis, kuna SVN-i &uuml;leslaadimise korral oleks andmemahu kasv teistele liialt suurenenud.
Kohati esines ka organisatoorseid probleeme nagu:
Erinevate visioonide t&otilde;rked
Laboris &otilde;igete asjadega mitte-tegelemine
Laborisse piisavalt palju mitte-j&otilde;udmine
Tekkinud vigade mitte-piisav v&auml;ljendamine
Selliseid asju ikka juhtub projektides, eriti veel sellistes, kus kellelgi ei ole kogemusi analoogsete ja h&auml;sti &otilde;nnestunud projektidega. Selles m&otilde;ttes, et eks me suutsime ennustada ja &auml;ra hoida vigu, mille taha me j&auml;ime eelmine aasta, kuid ka see aasta pakkus probleeme, mida me ei m&auml;rganud piisavalt enne, kui oli juba hilja nendega tegelemiseks.


OpenOffice Calciga tehtud arvutused
Tooksin v&auml;lja n&auml;iteks probleemi, et madala taseme koodi juures l&auml;ks algselt planeeritust kauem aega. Sai k&uuml;ll hinnatud aega mitmekordselt rohkem kui oleks olnud optimistlik, ent ka sellest j&auml;i puudu. Madala taseme roboti liikumist puudutava koodiga sai alustatud oktoobri algusel ning enam-v&auml;hem aktsepteeritava (loe: ka selles oli probleeme) versiooni saime valmis m&otilde;ningad p&auml;evad enne Tartu eelv&otilde;istlust novembri l&otilde;pul. Sellega seotud probleemidega tegelesime ka Robotexil v&otilde;istluste vahepeal. Probleemi suurimaks p&otilde;hjustajaks oli t&otilde;en&auml;oliselt kogemuse puudumine sellise valdkonnaga tegelmisel. Lahendamiseks tegime jooniseid ja m&otilde;tlesime teooria &uuml;le, kuidas roboti madala taseme liikumisloogika peaks t&ouml;&ouml;tama. Istusime ka tihti mitmekesi maha ja &uuml;ritasime koos asju &auml;ra teha. Vaatasime korduvalt l&auml;bi, millised andmed koodis ikkagi liiguvad, lahendasime nendega seotud matemaatikat nii paberil kui ka OpenOffice Calcis.
[redigeeri] Disain



Roboti disaini 3D mudel


N&ouml;&ouml;ri asemel hoiab l&ouml;&ouml;gimehhanismi s&uuml;damikku mitmekordne kummipael
Roboti disain j&auml;i samaks v&otilde;rreldes eelmise aastaga. Plaanis oli k&uuml;ll muuta r&uuml;peraali kinnitust (rihmade asemel klambrid) ning teha LED-ide juhtimine PWM-iga sujuvate &uuml;leminekute jaoks, kuid need j&auml;idki plaanideks.
V&auml;iksed muudatused olid n&auml;iteks juhtmete hoidmiseks roboti sisek&uuml;lgedele klambrite paigaldus, et suurem osa juhtmeid saaks m&ouml;&ouml;da k&uuml;ljeseinte sisepindu minna. Samuti kaane aluste juhtmete ja elektroonikakomponentide &uuml;mberdisain elektroonikaplaadiks ning selle pesastamine kaane alla kinnitatud plastkarpi.
[redigeeri] Mehaanika

Suuremad muudatused mehaanika osas olid:
Parempoolse ja tagumise ratta mootorite omavahel vahetamine (kuna parempoolne mootor tundus veidi v&auml;sinud)
L&ouml;&ouml;gimehhanismi s&uuml;damiku kinnituspaela &auml;ra v&otilde;tmine ja mitmekordse kummipaela kasutamine
[redigeeri] Elektroonika



Buzzer (valge) voolujaoturis


Arduino Duemilanove
Elektroonikaga tegeles Harti.
Suuremad muudatused olid uue l&ouml;&ouml;gimehhanismi plaadi jootmine ja paigaldus ning LED-ide ja vooluplaadi s&ouml;&ouml;vitamine, jootmine ja paigaldus.
Kohati kuumenesid &uuml;le ja p&otilde;lesid l&auml;bi 12V -> 5V lineaarsed pingeregulaatorid, mida kasutasime LiPo'st tuleva pinge muundamiseks +5V-ks. Neid sai m&otilde;ned varuks ostetud roboti peal parema jahutusega varustatud. Kuumenemise probleem oli ilmselt mootorite plaadi Atmegas, mis tarbis ligi 0,5A voolu.
Samuti sai kohe alguses ostetud Arduinole uus ATMega 328P, kuna eelmisel aastal p&otilde;les teadmata p&otilde;hjustel selle peal &uuml;ks l&auml;bi. K&otilde;ige t&otilde;en&auml;olisem tundub, et n&auml;iteks rauapuru vm. tekitas sellel l&uuml;hise. V&otilde;i m&otilde;jus coili plaadi m&uuml;ra talle h&auml;vitavalt.
Uuendus oli m&otilde;ningad p&auml;evad enne Robotexi robotile lisatud buzzer, mis leidis rakendust m&auml;rgu andmiseks g&uuml;roskoobi kalibratsioonist, palli l&ouml;&ouml;misest ja v&otilde;istlusaja l&otilde;ppemisest.
[redigeeri] Mootorite Plaat


Mootorite Plaat
Mootorite Plaadi osas tekkis vahepeal probleem, et plaat ei k&auml;ivitunud. Kasutasime m&otilde;nda aega eelmie aasta meeskond Pacmani Mootorite Plaati ja p&auml;rast jootsime enda omale uue ATMega. Varem seal olnud 324PV sai asendatud 644P-ga, mille j&auml;rel hakkas plaat j&auml;lle t&ouml;&ouml;le. M&otilde;lemal mudelil on samasugune jalgade j&auml;rjestus ja paigutus ning Mootorite Plaadil on nad samav&auml;&auml;rsed.
Samuti ei t&ouml;&ouml;tanud &uuml;ks magnetandurite pistik p&auml;rish&auml;sti, seega asetasime seal olnud magnetanduri teise pistiku peale (kolmandalt neljandale; lugedes digiwiki joonise j&auml;rgi vasakult). &Uuml;ks MLX90316 magnetanduritest oli ka l&auml;bi p&otilde;lenud (v&otilde;i mingil p&otilde;hjusel t&ouml;&ouml;tamise l&otilde;petanud). &Otilde;nneks oli meil eelmisest aastast joodetud &uuml;ks varuga, seega sai ka too &auml;ra vahetatud.
Ka eelmisel aastal tehtud programmaatori juhe l&auml;ks rohke kasutamise peale &uuml;hel momendil katki. Sai veidi parandatud ja edasi programmeeritud.
[redigeeri] L&ouml;&ouml;gimehhanismi Plaat


L&ouml;&ouml;gimehhanismi Plaat
Eelmise aasta coiliplaat oli hirmus m&uuml;rane ning temast lahti saamine &auml;&auml;rmiselt t&auml;htis, pealegi lahendus SS-releega ja ilma ATMegata eelmise aasta plaadiga ei tundunud eriti kena ja kuna sellel aastal pakuti uut ning paremat L&ouml;&ouml;gimehhanismi Plaati, siis otsustasime haarata asjast kinni ning loota parimat.
Plaadi jootmine sujus h&auml;sti. Veidi oli probleeme piikribade ja m&otilde;ningate komponentide k&auml;tte saamisega, kuid jootmisvigu meil ei tekkinud ning ning m&otilde;ningad vead, mis plaadi disainimisel tehtud olid parandas Harti elegantselt. Nii saime l&ouml;&ouml;gimehhanismi kiiresti ja h&auml;sti t&ouml;&ouml;le.
Hiljem avastas Mihkel Pajusalu siiski plaadilt elektroonikavea, mis v&otilde;is pikemas perspektiivis probleeme tekitada. Tsiteerime siinkohal meeskonnakaaslast T&otilde;nist:
T&otilde;nis: Mihkel Pajusalu k&auml;is r&auml;&auml;kimas, et coiliplaadil KICK pini j&auml;rel on tavaline npn-transistor, ning kui koodis kirjutada KICK pin madalaks, et coilgun l&ouml;&ouml;ks, siis peale l&ouml;&ouml;ki j&auml;&auml;b see npn-transistor ka madalaks ning sellega seoses on koguaeg atmegal +5V peal (see on vist halb nagu ma aru saan). Et seda v&auml;ltida tuleb panna mittel&ouml;&ouml;mise ajaks KICK pin INPUT'ks. Teine v&otilde;imalus seda viga parandada on asendada see tavaline npn-transistor n-MOSFET'iga.
[redigeeri] LED-ide ja vooluplaat


LED-ide ja vooluplaat
LED-ide ja vooluplaadi k&otilde;ige suurem eesm&auml;rk oli v&auml;hendada juhtmete ja lahtiste elektroonikakomponentide hulka roboti kaane k&uuml;ljes. Seal olid juhtmed l&uuml;litite, LED-ide, LiPo ja Arduino ning voolujaoturi vahel. Nimelt on kaane peal 3 l&uuml;litit:
P&otilde;hiline voolul&uuml;liti - punane
POWER-l&uuml;liti, v&otilde;istluse algust t&auml;histav loogiline signaal Arduinosse - roheline
LED-ide l&uuml;liti - sinine
Arduino pidi olema &uuml;henduses LiPo maaga, +12V LED-e kontrollivate transistoritega ja POWER-nupuga. Kaane juures oli vaja +12V muundada +5V-ks, et toita loogilist signaali Arduinosse. Ning LiPo ja LED-ide vooluringi pidid kontrollima &uuml;lalnimetatud l&uuml;litid.
Selle k&otilde;ige tarvis ja &otilde;ppimishuvi t&otilde;ttu saigi see aasta proovitud disainida ja s&ouml;&ouml;vitada ise elektroonikaplaati. Vastuolulise info (s&ouml;&ouml;vitamise juures seinal olev juhend; s&ouml;&ouml;vitamise videoloeng; inimeste kohapealsed juhendused) ning kogenematuse t&otilde;ttu tuli katsetada p&auml;ris mitu korda. L&otilde;puks sai plaat aga tehtud ja suur juhtmepundar roboti kaane alt &auml;ra koondatud v&auml;iksesse karpi, kuhu pesastasime plaadi.
[redigeeri] Programmeerimine

[redigeeri] R&uuml;peraal (Ordi; Lubuntu)


Kasutajaliides k&auml;skudega robotile ja robotist.


Kasutajaliides v&auml;rvitud v&auml;ravate nuppude ja manuaalse kontrolli juhistega.


Pildit&ouml;&ouml;tluse vaade. Probleem v&auml;ravas olevate pallidega sai lahendatud laiendades (dilate) v&auml;rava sinist ala.
J&otilde;udluse huvides paigaldasime r&uuml;peraalile Lubuntu (Linuxi). Eks see oli kahe otsaga otsus. &Uuml;hest k&uuml;ljest oli lootus paremaks j&otilde;udluseks, kogemus Linuxiga t&ouml;&ouml;tamisel ning m&otilde;ningad huvitavamad vahendid. Teisest k&uuml;ljest l&otilde;ikasime &auml;ra osa Microsofti vahenditest, mille olemasolu korral oleks t&otilde;en&auml;oliselt Marti saanud teatud probleeme kiiremini lahendatud. Samuti l&auml;ks veidi aega olemasoleva koodi portimise peale. Tagantj&auml;rele m&otilde;eldes ei andnud see valik meile v&auml;ga palju juurde, kuid t&otilde;en&auml;oliselt ei v&otilde;tnud ka eriti palju &auml;ra.
Tooksin v&auml;lja veel plussi, et koodi portimise k&auml;igus &otilde;ppisin seda paremini tundma, tuletasin meelde ning sain rohkematest asjadest aru.
R&uuml;peraalil oleva C# koodiga tegelesin mina (Raimond) ja Marti. Marti keskendus pildit&ouml;&ouml;tluse uuesti tegemisele v&otilde;ttes kasutusele lihtsamaid algoritme, et saavutada k&otilde;rgem FPS. Mina tegin &uuml;mber suhtlemisk&auml;ske ning k&otilde;rgema taseme loogikat (roboti strateegiat). Kasutajaliidese roboti juhtimiseks ja t&ouml;&ouml;k&auml;igu j&auml;lgimiseks tegime koos T&otilde;nisega GTK-s.
Koodi kirjutasime Monos ning raskusi esines erinevate asjade juures. K&otilde;ige erksamalt on meeles j&auml;rgnevad kolm probleemi:
Kasutatud EmguCV build sisaldas kriitilist viga. Kuna uuema versiooni buildimine oleks t&otilde;en&auml;oliselt p&otilde;hjustanud muid probleeme, siis tegi Marti sellele paranduse.
Linuxi all ei kutsuta v&auml;lja SerialPort klassi eventi DataReceived. Windowsi all too t&ouml;&ouml;tas, kuid Linuxi peal oli ainus v&otilde;imalus teha p&otilde;hits&uuml;klis andmete lugemise v&auml;ljakutse vastavale pordile - viide.
GTK kasutajaliidese elementide muutmiseks tuleb Gtk.Application l&otilde;imele delegeerida vastavad muutmisk&auml;sud, ei tohi teistest l&otilde;imedest neid otse muuta - viide.
K&otilde;ige huvitavam oli minu meelest programmeerida j&auml;rgnevaid asju:
&Uuml;ldine loogika, mis v&otilde;tab arvesse pildit&ouml;&ouml;tlusest ja Mootorite Plaadilt tulnud andmeid ja langetab selle p&otilde;hjal otsuseid. N&auml;iteks, kui pildit&ouml;&ouml;tlus &uuml;tleb, et roboti ees on sein, siis ma vaatan, kus on Mootorite Plaadi poolt leitud oletatav roboti kordinaat ja nurk v&auml;ljakul ning vastavalt sellele s&otilde;idan teatud arvu sekundeid tagasi ning p&ouml;&ouml;ran ennast teatud suunas &uuml;mber.
Arduino USB &uuml;henduse katkemise korral uuesti &uuml;henduse loomine, kui &uuml;hendus vastavasse porti tagasi tuleb.
GTK TextView objektide puhvrisse viimase viie saadetud k&auml;supaketi ja vastuv&otilde;etud andmepaketi andmete kuvamine.
Kasutajaliidesele klahvide kuulamise peale robotile vastavate k&auml;skude saatmine.
P&otilde;nev oli Marti poolt tehtud pildit&ouml;&ouml;tluse lihtsus. N&auml;iteks seinte tuvastuseks kontrollisime ainult kahel vertikaalsel pikslireal olevaid v&auml;rve. Sein oli &uuml;hel pool ees, kui sealsel pikslireal esines 50 piksli hulgas k&otilde;igepealt v&auml;hemalt 15 halli, seej&auml;rel 5 valget ning l&otilde;puks &uuml;ks roheline piksel - viide. V&auml;ga &auml;ge, kuidas selline lihtne algoritm t&ouml;&ouml;tas reaalses olukorras &uuml;llatavalt h&auml;sti. Ainus probleem oli selles, et Robotexil oli &uuml;ks sein v&auml;ga palju valgem kui teised v&otilde;i ka testv&auml;ljaku seinad ning halle piksleid oli sealt raske tuvastada.
Analoogne lihtne, kuid palju juurde andev lahendus oli Martil l&ouml;&ouml;gitrajektooride ette j&auml;&auml;vate pallide tuvastamiseks. Ehk siis kontrollides kolme pikslirida oranžilt kanalilt - viide.
Pildit&ouml;&ouml;tluse juures k&otilde;ige suuremaks mureks j&auml;i see, et meil ei &otilde;nnestunud saada EmguCV-ga 60 FPS-i k&auml;tte. &Uuml;mber enda telje p&ouml;&ouml;ramise korral l&auml;ksid objektide piirjooned uduseks ja CamShift algoritm kippus palle &auml;ra kaotama. Kaameral oli k&uuml;ll v&otilde;imalus 60 FPS-i kasutada ning muu tarkvaraga testides saime v&auml;ga terava pildi ka p&ouml;&ouml;rlemise korral, kuid EmguCV all olev OpenCV ei suutnud kaamerale saata k&auml;sku, et l&uuml;lituda 60 FPS režiimi. Funktsioonid olid olemas, kuid funktsionaalsust nendes ei olnud - viide.
[redigeeri] Arduino


Arduino vilkuva valgusdioodiga &uuml;hendusel 13.
Arduinot programmeeris enamasti Raimond. Muudatused olid p&otilde;hiliselt k&auml;skude saatmise ja vastuv&otilde;tmise osas failides SerialReceiver.pde, SerialSender.pde, WireReceiver.pde, WireSender.pde. Nimelt muutsime &auml;ra k&auml;sustiku selliseks, et k&auml;sud oleksid v&otilde;imalikult lihtsad. Kui me enne andsime n&auml;iteks liikumisk&auml;sus ette uue positsiooni, kus robot peab asuma, siis n&uuml;&uuml;d koosnes liikumisk&auml;sk ainult identifikaatorist, liikumissuunda n&auml;itavast nurgast ja kiiruse protsendist.
N&auml;iteks, et liikuda 90-kraadise nurga suunas (vasakule) maksimaalse v&otilde;imaliku kiirusega (100%), oli k&auml;sk:
M 90 100
Selline k&auml;sk saadeti Arduinosse r&uuml;peraalist ning ettevaatusabin&otilde;una sai Arduinosse kirjutatud veel juurde funktsionaalsus, et kui &uuml;he sekundi jooksul ei ole uut liikumisk&auml;sku tulnud ja Mootorite Plaadile vaja saata, siis saadetakse stop-k&auml;sk:
S
Peale liikumisk&auml;su olid veel p&ouml;&ouml;ramisk&auml;sud vastavalt vasakule ja paremale etteantud kiirusprotsendiga maksimaalsest. N&auml;iteks poolega (50%) maksimaalsest p&ouml;&ouml;rlemiskiirusest p&ouml;&ouml;ramiseks olid k&auml;sud:
L 50
R 50
Protsenti kasutasime ka l&ouml;&ouml;gimehhanismi l&ouml;&ouml;misk&auml;su juures, kuna iga kord ei pruukinund olla vajadust l&uuml;&uuml;a maksimaalse tugevusega. Meie kasutatud maksimaalne tugevus ei olnud tegelikult l&ouml;&ouml;gimehanismi maksimaalne v&otilde;imalik tugevus (kondensaatori t&uuml;hjaks laskmine), vaid selline fikseeritud tugevus, millega katsetuste tulemusel saime palli &uuml;hest v&auml;ljaku otsast &uuml;le platsi teise v&auml;ravasse &auml;ra l&uuml;&uuml;a. L&ouml;&ouml;miseks 75%-se tugevusega tuli r&uuml;peraalist Arduinosse saata k&auml;sk:
F 75
&Uuml;hendades hiljem Arduino k&uuml;lge buzzeri oli ka selle jaoks vaja k&auml;sku. Kasutades &uuml;htset stiili, sai ka tollele k&auml;sule m&auml;&auml;ratud tugevus. Antud juhul t&auml;hendas tugevus seda, millise t&otilde;en&auml;osusega iga ts&uuml;klikord buzzerile voolu antakse. Kogu aeg (100%) pinge peal hoidmiseks v&otilde;is saata k&auml;su:
B 100
Valgusdioodide kontrollimiseks j&auml;i alles eelmise aasta k&auml;sk, millel &uuml;he baidine lisaparameeter n&auml;itas, millist v&auml;rvi dioodidele voolu anda. Lisaparameetrist loeti kolm viimast bitti paremalt vastavalt punase, rohelise ja sinise v&auml;rvi jaoks. N&auml;iteks, et n&auml;idata kollast v&auml;rvi tuli saata k&auml;sk:
X 3
X 00000011b


WireReceiver.pde faili viimane seis SVN-is. Faili &uuml;lesanne: Mootorite Plaadi pakette vastu v&otilde;tta ja t&ouml;&ouml;delda. Kui I2C siini taga &uuml;hendust pole, siis p&otilde;hjustab Wire.requestFrom(...) s&uuml;steemi hangumise.
Arduino tegeles samuti ka Mootorite Plaadist tulevate pakettide edasi saatmisega r&uuml;peraali. Pakette oli kahesuguseid. Esimene oli ka eelmisel aastal kasutusel olnud andmepakett, kus olid p&auml;rast identifikaatorit kirjas kolm int-t&uuml;&uuml;pi v&auml;&auml;rtust (2 baiti iga&uuml;ks), mis hoidsid endas Mootorite Plaadi poolt leitud oletatavaid v&auml;&auml;rtusi globaalsete X-, Y-kordinaatide ja roboti globaalse nurga jaoks. Pakett, kui robot asus &uuml;leval vasakus nurgas suunaga &uuml;les/otse, v&otilde;is olla n&auml;iteks:
P -3000 4000 0
Teine pakett, mis sai programmeeritud suhteliselt l&otilde;pupoole, oli g&uuml;roskoobi kalibreerimisest teada andev pakett. Ajal, mis Mootorite Plaadi k&uuml;ljes olev g&uuml;roskoop ennast kalibreeris, ei tohtinud robotit liigutada ja selle ajal oli m&otilde;istlik helistada buzzerit, mis asus Arduino k&uuml;ljes. Selleks saadeti kalibreerimise ajal ja hetk p&auml;rast kalibreerimist k&auml;ske:
G 75  (hiljem G 50)
G 0  (buzzeri peatamiseks)
P&otilde;hiline mure Mootorite Plaadiga suhtlemise juures oli ehk see, et Arduino Wire teek, mis on m&otilde;eldud Two-Wire Interface'i (n. I2C) l&auml;bi suhtlemiseks teiste seadmetega, ei sisalda endas liidese majandamist. See t&auml;hendas, et juhul, kui Mootorite Plaat oli n&auml;iteks v&auml;lja l&uuml;litatud, ei saanud Arduino sellest aru ning j&auml;i ootama, millal I2C siini peal saab uuesti andmeid vahetada. &Uuml;ldiselt roboti k&auml;itumist see suuresti ei m&otilde;jutanud, kuna Mootorite Plaat oli kogu aeg t&ouml;&ouml;s ja suhtlus nende kahe seadme vahel kiire. Aga enne sellise k&auml;itumise teadmist aru saada, et miks Arduino n&auml;iliselt hangub, oli veidi frustreeriv.
Vahepealset segadust k&uuml;lvas ka Arduino koodi vigade avastuse ja parandamise eesm&auml;rgil lisatud sleep() k&auml;sk. Selle k&auml;su koodi unustamise t&otilde;ttu tekkis r&uuml;peraali ja Arduino andmevahetusse sisse mahaj&auml;&auml;mus, mille p&otilde;hjusest oli algul raske aru saada.
[redigeeri] Mootorite Plaat
Mootorite Plaadiga tegelesid T&otilde;nis, Harti ja Raimond.
Ka sellel aastal oli Mootorite Plaadi kood meie meeskonnas p&otilde;hiline raskus ning reaalses olukorras roboti &otilde;igesti liikumise programmeerimine v&otilde;ttis k&otilde;ige rohkem aega.


P&auml;rast ATMega 644P paigaldust uute sissekannetega t&auml;iustatud boards.txt fail.


Mootorite Plaadi programmeerimine AVR-ISP-iga
Raimond tegeles enamasti alglaadijate (bootloader) paigaldamisega Mootorite Plaadile. Kasutatud sai analoogselt varasemale Sanguino alglaadijat, mis on m&otilde;eldud ATMega 644P jaoks. Mootorite Plaadil varem olnud 324PV ja hiljem olnud 644P sobisid selle alglaadija jaoks. Vahepeal sai Mootorite Plaati programmeerida USB-UART &uuml;leminekuga, kuid teadmata p&otilde;hjustel l&otilde;petas too korralikult t&ouml;&ouml;tamise. Seej&auml;rel programmeerisime AVR ISP-i kasutades edasi, kuid nendega oli tihtipeale samuti jama. N&auml;iteks m&otilde;ned AVR ISP-id tahtsid s&uuml;steemilt spetsiaalseid draivereid (m&otilde;ned mitte). &Uuml;hel oli juhe katki ning lahti v&otilde;tmise ja juhtme uuesti paigaldamise korral hakkas t&ouml;&ouml;le. M&otilde;ned olid aeglasemad (~5 sekundit), m&otilde;ned kiiremad (~1 sekund). Kohati juhtus ka, et laboris olevad AVR ISP-id olid k&otilde;ik kasutuses ja pidime enda j&auml;rge ootama.
T&otilde;nis ja Harti tegelesid Mootorite Plaadis oleva liikumisloogika kirjutamisega. See t&auml;hendas, et kui Mootorite Plaat sai sisse Arduinolt I2C kaudu k&auml;su liikuda otse (0 kraadi suunas) maksimaalse kiirusega (100%), siis oli vaja saata mootoritele &otilde;ige PWM ja kuni polnud tulnud uut k&auml;sku, v&otilde;tta arvesse magnetandurite ja g&uuml;roskoobi n&auml;ite, et mootoritele saadetavaid PWM-e korrigeerida vastavalt vajadusele (kui robot ei liigu otse).
Saabunud k&auml;skude semantika (n. otse s&otilde;itmine) &otilde;igeks t&auml;itmiseks reaalses maailmas v&otilde;tsime kasutusele PID-kontrolleri. Tegu on algoritmiga, mis v&otilde;imaldab hoida mingit reaalse maailma v&auml;&auml;rtust soovitud kohal v&otilde;ttes arvesse v&otilde;imalikku tekkivat viga. Algoritmil on kaks sisendit ja &uuml;ks v&auml;ljund:
Setpoint - v&auml;&auml;rtus, mida tuleks hoida
Input - reaalne m&otilde;&otilde;detud v&auml;&auml;rtus
Output - v&auml;ljund, mis saadetakse reaalset maailma m&otilde;jutavale seadmele
Mark seletas mulle, et meie holonoomilise kolme omni-rattaga roboti juures v&otilde;ib PID-kontrollerit rakendada kolmel tasemel:
Rattamootori tasemel - PID hoiab &uuml;hele rattale saadetud PWM-i ja tegelikku p&ouml;&ouml;rlemiskiirust vastavuses
S&otilde;iduvektori tasemel - PID hoiab roboti sihti, suunda ja kiirust
Asukohavektori tasemel - PID &uuml;ritab hoida roboti asukohta
Eelmine aasta &uuml;ritasime teha esimest ja kolmandat nendest, kuid ei suutnud l&otilde;puni implementeerida. Seega sellel aastal otsustasime koosk&otilde;las lihtsamate liikumisk&auml;skudega rakendada teise taseme PID-kontrollerit.


Joonis PID-kontrollerite ja kinemaatika kohta PidAlpha n&auml;ol.


Aeglase ja kiire liikumise PID-kontrollerite parameetrid. Erinevused on PidTheta kordajates.
See t&auml;hendas teoreetiliselt seda, et kui robot seisab paigal tuleb sisse k&auml;sk liikuda maksimaalse kiirusega otse, siis PID-kontroller hakkab suurendama otse liikumiseks vajaliku s&otilde;iduvektori pikkust. Inverse kinematics vastutab selle eest, et too vektor teisendatakse mootoritele saadetavateks PWM-ideks. Seej&auml;rel m&otilde;&otilde;davad magnetandurid ja g&uuml;roskoop reaalse maailma muutusi ning Forward kinematics teisendab need muutused reaalselt s&otilde;idetud s&otilde;iduvektoriks. Seej&auml;rel vaatab PID-kontroller, kui palju erines reaalne s&otilde;iduvektor meie soovitavast s&otilde;iduvektorist ning j&auml;rgmisena saadab teistsuguse s&otilde;iduvektori, milles on arvestatud eelneval iteratsioonil tekkinud viga.
Praktikas &uuml;ritasime k&otilde;igepealt seda funktsionaalsust saavutada PID-kontrolleritega kolmel lihtsal liikumisel. Ehk siis defineerisime s&otilde;iduvektori x- ning y-telje suunal ja kohapeal p&ouml;&ouml;rlemise kiirusega Theta. Esialgne l&auml;henemine v&otilde;imaldas s&otilde;ita maksimaalse kiirusega neljas suunas. Hiljem arendasime seda l&auml;henemist edasi m&auml;&auml;rates s&otilde;iduvektori komponentideks kiirusprotsendid x- ning y-teljel ja p&ouml;&ouml;rlemisel. See l&auml;henemine tundus m&otilde;istlik, sest n&auml;iteks otse liikumiseks t&auml;hendas see j&auml;rgnevaid setpointe:
PidX.setSetpoint(0);
PidY.setSetpoint(1.0 * MAX_MOVE_VELOCITY);
PidTheta.setSetpoint(0);
Harti t&auml;heldas, et me peame &uuml;le m&otilde;&otilde;tma ka reaalse kiiruse, millega robot suudab n&auml;iteks otse s&otilde;ita, et kinemaatikatel oleks v&otilde;imalik leida, kui palju me maksimaalsest kiirusest saavutasime. Esialgne m&otilde;&otilde;detud maksimaalne liikumiskiirus fikseeritud suunas oli keskmiselt 0.4 m/s. Hiljem sai see tarkvaras suurendatud 2 peale, T&otilde;nisele tundus see j&otilde;udluse huvides parem olevat. P&ouml;&ouml;rlemiskiirus j&auml;i l&otilde;puks arbitraarne 5.
Vahepeal m&otilde;tlesime, et PidX ja PidY asemel on ehk v&otilde;imalik kasutada hoopis PidAlphat, mis hoiaks ainult nurka, mille alla robot liikuda tahab. Probleem selle l&auml;henemisega tekkis selles, et v&otilde;imatu oli kontrolleritele &ouml;elda, et robot peaks paigal seisma. Paigalseismiseks oleks tulnud kontrollerid v&auml;lja l&uuml;litada ja tundus, et analoogseid probleeme v&otilde;ib veelgi tekkida.
Seega l&otilde;puks leidsime, et kolme parameetriga s&otilde;iduvektor on parem kui kahega.
Reaalse testimise k&auml;igus selgus, et PID-kontrollerite proportsionaalse, integraalse ja derivatiivse osa kordajad ei sobi samad erinevatele kiirustele. N&auml;iteks suure p&ouml;&ouml;rlemiskiiruse juures suutis robot h&auml;sti hakkama saada, kuid paigalseismise v&otilde;i v&auml;ikse p&ouml;&ouml;rlemiskiiruse juures tekkis vibratsioon - robot p&ouml;&ouml;ras natuke, PidTheta &uuml;ritas vastu p&ouml;&ouml;rata, robot p&ouml;&ouml;ras teisele poole ja sama asi kordus peegelpildis.
Samuti oli n&auml;iteks kiirendus v&auml;iksele liikumiskiirusele suhteliselt aeglane. Tekkis isegi probleem 70%-se liikumiskiirusega, mille korral j&auml;i robot v&auml;ljakul oleva joone peale kinni. Arduino saatis &otilde;iget k&auml;sku liikuda 70%-se kiirusega otse &auml;ra sealt, kuid Mootorite Plaadi kood ei olnud v&otilde;imeline &otilde;igeaegselt aru saama, et robot tegelikult ei liigu, meie s&otilde;iduvektor on (0,0,0), kuigi me soovime (0, 0.75 * MAX_MOVE_VELOCITY, 0) ning j&auml;relikult peaksime Y-komponenti t&otilde;stma. Teoorias peaks integraalne (vigu summeeriv) osa sellise probleemiga lihtsasti hakkama saama, kuid praktikas asjad nii lihtsad ei olnud.
L&otilde;puks tuli erinevad P, I ja D osa kordajad m&auml;&auml;rata aeglasemate ja kiiremate kiiruste jaoks. Samuti ka p&ouml;&ouml;rlemise ja liikumise jaoks. See t&auml;hendab, et kui oli vaja p&ouml;&ouml;relda, siis PidX ja PidY kordajad l&auml;ksid teistsugusteks, kui nad olid liikumise juures. Eraldi kordajad tulid ka paigalseismise k&auml;sule.
&Uuml;hes&otilde;naga l&auml;ks roboti enam-v&auml;hem adekvaatse liikumise peale v&auml;ga palju aega, katsetusi ja matemaatikat. Korduvalt vaatasid T&otilde;nis ja Harti &uuml;le &uuml;hikuid, mida kinemaatikates kasutati ja arvutati ratta&uuml;mberm&otilde;&otilde;tude ning rataste kauguste roboti keskpunktist p&otilde;hjal vahemaid ja nendest tulenevaid kiirusi.
L&otilde;ppkokkuv&otilde;tteks robot siiski liikus. Mitte k&uuml;ll igas olukorras k&otilde;ige paremini, kuid enamikel juhtudel siiski adekvaatse t&auml;psuse ja kiirusega.
[redigeeri] L&ouml;&ouml;gimehhanismi Plaat


&Uuml;hendatud L&ouml;&ouml;gimehhanismi Plaat koos suure kondensaatoriga.
L&ouml;&ouml;gimehhanismi plaadi programmeerimisega tegelesid T&otilde;nis ja Raimond. V&auml;ga palju suuri probleeme sellega ei esinenud, kuna loogika oli suhteliselt lihtne. T&auml;navune l&ouml;&ouml;gimehhanismi plaat toetas mikroprotsessori kasutamist ning ei rikkunud seda m&otilde;ningase kasutamise j&auml;rel. Seega oli seal mitmesugust erinevat funktsionaalsust, n&auml;iteks oleks v&otilde;inud sinna saata m&otilde;nelt muult plaadilt pakette SPI kaudu.
Pakettide saatmise otsustasime &auml;ra j&auml;tta, kuna L&ouml;&ouml;gimehhanismi Plaadile reaalselt edastatav infohulk oli piisavalt v&auml;ike. Kasutasime plaadile minevat &uuml;hte sisendviiku (PLUNGER), mille k&otilde;rgeks minemise korral &uuml;hendame kondensaatori m&auml;hisega ja l&ouml;&ouml;gimehhanism l&ouml;&ouml;b. Muul ajal laeme kondensaatorit.
Laadimise juures loeme sisendviiku (MEASURE), mis n&auml;itab, kui t&auml;is kondensaator parasjagu on. See on analoog sisendviik, mis t&auml;hendab, et reaalne sisend (0-st kuni 5 voldini) on jaotatud 10-bitises analoog-digital muunduris t&auml;isarvudele 0 kuni 1023. Kondensaatori laadimistingimus (peale selle, et PLUNGER &uuml;hendus peab madal olema) oli j&auml;rgnev:
if (analogRead(MEASURE) <= 758){
 ...
}
See hoidis kondensaatorit ligikaudu 200V juures. Kui pinge kukkus allapoole seda (aja m&ouml;&ouml;dudes ikka kukkus), laeti koheselt uuesti selleni t&auml;is. Sellise laadimisega tekkis kerge pidev heliline efekt, kuid kinnitati, et s&uuml;steemile see midagi halba ei tee.
L&ouml;&ouml;mise aega kontrollis Arduino, mis saatis vastava aja PLUNGER-&uuml;hendusse k&otilde;rget signaali. 100%-le vastas aeg 5000 mikrosekundit ehk 5 millisekundit.
delayMicroseconds(map(power, 0, 100, 0, 5000));
Maksimaalse (5ms) ajaga v&otilde;ttis &uuml;ks l&ouml;&ouml;k kondensaatorilt umbes 40V. Sellest piisas, et l&uuml;&uuml;a pall &uuml;hest v&auml;ljaku &auml;&auml;rest vastas asuvasse v&auml;ravasse.
K&otilde;ige kahtlasem koht L&ouml;&ouml;gimehhanismi Plaati programmeerides oli see, et MEASURE-sisendviiku ei olnud v&otilde;imalik enne lugeda kui oli loetud DONE-sisendviik.
Samuti oli h&auml;iriv, et plaadi elektroonilises disainis oli tehtud nii, et l&ouml;&ouml;mine toimub siis, kui KICK-v&auml;ljund madalaks teha, muul juhul peab k&otilde;rge olema. Laadimine toimus samuti siis, kui CHARGE-v&auml;ljund madal oli, muul ajal tuli hoida k&otilde;rgena. V&otilde;imalik, et selline s&uuml;steem on elektroonika seisukohast m&otilde;istlik, kuid programmeerijale tunduksid intuitiivsemad vastupidised v&auml;&auml;rtused.
[redigeeri] Mida me Robotexist &otilde;ppisime

[redigeeri] Raimond


Robotexil koos meeskonnaga valmis rohelist nuppu vajutama.
&Otilde;ppisin, et praktikas on v&auml;ga oluline testimine. Eeldasin seda juba alguses ning eesm&auml;rk oli j&otilde;uda erinevate komponentide testimiseni nii kiiresti kui v&otilde;imalik, ent kohati tekkis siiski etten&auml;gematuid viivitusi ning oleks soovinud rohkem testida (ja selle k&auml;igus avastatavaid vigu parandada).
Projektijuhtimine oli huvitav kogemus. Eeldasin, et kindlasti kulub sellele suur osa minu ajast ning seet&otilde;ttu &uuml;ritasin &uuml;lej&auml;&auml;nud valdkondi jagada inimeste vahel v&otilde;rdselt &auml;ra. Siiski selgus, et erinevad valdkonnad vajasid rohkem abi kui alguses eeldatud, ja sellet&otilde;ttu j&auml;i mul puudu ajast projektijuhtimisele p&uuml;henduda. Otsene tulemus sellel oli n&auml;iteks kaamera madalast FPS-ist tulenev probleem, mida ma k&uuml;ll mainisin, ent ebapiisava t&auml;htsustamise t&otilde;ttu ei suutnud selle kriitilisust vajalikul m&auml;&auml;ral r&otilde;hutada.
Katsusin olla vastutulelik ning n&auml;hes, et m&otilde;nel meeskonnaliikmel ei l&auml;he aeg laboris just k&otilde;ige otstarbekamalt, t&otilde;in raamatukogust vabadel hetkedel lugemiseks raamatud Introduction to Autonomous Mobile Robots ning Mikrokontrollerid ja praktiline robootika.
Sain kogemust, et suhtluskanalid nagu blogi pidamine, Skype ja telefon on k&uuml;ll v&auml;&auml;rtuslikud, kuid m&otilde;ningatel juhtudel ei pruugi anda optimaalset efekti. N&auml;iteks juhtus olukordi, et kirjutasin blogisse k&uuml;ll, et mida sai eelmisel p&auml;eval tehtud ning kus tekkisid lahendamist vajavad probleemid, kuid m&otilde;ned meeskonnaliikmed ei olnud ennast sissekandega kurssi viinud ning seet&otilde;ttu segadusse sattunud.
Huvitav oli j&auml;lgida inimeste vahel tekkivaid probleeme ning katsuda neid lahendada. N&auml;iteks ei olnud T&otilde;nis rahul Mootorite Plaadi koodistruktuuriga (erinevate komponentide eest vastutavad osad klassideks jaotatud) ning avaldas soovi kirjutada otsast peale uus kood. Kaalusime seda v&otilde;imalust paar p&auml;eva ja konsulteerisime omavahel, selgitasime v&auml;lja, et probleemi alge oli poolte meeskonnaliikmete v&auml;hene kokkupuude objekt-orienteeritud paradigmaga. L&otilde;puks j&otilde;udsime j&auml;reldusele, et suure t&otilde;en&auml;osusega ei suudaks mitte-objekt-orienteeritud l&auml;henemine luua koodis navigeerimist piisavalt mugavaks ning v&otilde;taks &uuml;lem&auml;&auml;ra kaua aega implementeerimiseks.
Ma loodan s&uuml;gavalt, et sellele ning teistele tekkinud probleemidele suutsin p&ouml;&ouml;rata piisavalt t&auml;helepanu ning anda k&otilde;igile argumentidele v&otilde;rdse v&otilde;imaluse kaalule asetamiseks. Ja et l&otilde;puks vastuv&otilde;etud otsused olid kompromissid, millega k&otilde;ik v&otilde;isid rahule j&auml;&auml;da.
&Otilde;ppisin kasutama erinevaid huvitavaid vahendeid nagu Visio koostamaks diagramme, mis ma loodan, et andsid hea &uuml;levaate teistele meeskonnaliikmetele projekti kohta. V&auml;&auml;rtustan kogemust kasutada Lubuntut ning programmeerida C#-i kasutades MonoDevelop'it. V&auml;rskendav ning p&otilde;nev oli kasutada C#-i k&otilde;rgest tasemest tulenevaid programmeerimisvahendeid nagu lambda-funktsioonid ja delegate. Samuti tutvuda primitiivi nullitavaks m&auml;rkiva k&uuml;sim&auml;rgi s&uuml;ntaksiga. Sain ka kogemust l&otilde;imede erinevate variantidega.
[redigeeri] Marti


Marti koos Raimondiga l&auml;bi Logitechi veebikaamera programmis Cheese
Teist aastat Robotexil osalenuna seadsin ootused l&otilde;pptulemuse osas k&otilde;rgele. Kogesin esimest korda, kui palju keerulisem on kaugt&ouml;&ouml;ga heade tulemusteni j&otilde;udmine. Eelmisel aastal hoidis fookust paigas pidev suhtlus meeskonnaga, sel aastal tegid seda eelk&otilde;ige telefonik&otilde;ned Raimondiga.
&Otilde;ppisin rasket teed pidi, et keeruliste lahenduste arendamist tasub teha alles siis, kui on olemas lihtne/rumal/aeglane, aga t&ouml;&ouml;tav lahendus. Eriti t&auml;htis on see meeskonnat&ouml;&ouml; puhul, sest liikmed v&otilde;ivad tihti oodata minu tulemuste taga.
L&auml;htusin pildit&ouml;&ouml;tluse koodi kirjutades teadmisest, et koodi ei tasu enneaegselt optimiseerima hakata. K&uuml;ll aga oleks nii kriitilise osa puhul v&otilde;inud teha rohkem eelt&ouml;&ouml;d, et leida ilmselgelt paremad lahendused juba eos. Kui m&auml;rkasin, et keerulised algoritmid ei toonud soovitud j&otilde;udlust, vahetasin need v&auml;lja j&otilde;hkra j&otilde;uga t&ouml;&ouml;tavate lahenduste vastu - p&otilde;hjalikuma anal&uuml;&uuml;si puhul oleksin seda v&otilde;ib-olla teinud juba varem.
Suureks komistuskiviks meie projektis oli minu arvates otsus vahetada robotit juhtiva s&uuml;learvuti peal operatsioonis&uuml;steem, muutmata seejuures tarkvara platvormi. Kulutasime v&auml;ga palju aega Ubuntu, Mono ja veebikaamera seadistamisele, mida oleksime saanud teiste tehnoloogiate kasutamisega v&auml;ltida. If it ain't broke, don't fix it.
Tuhin roboteid ehitada on mul j&auml;tkuvalt suur ja loodan teha koost&ouml;&ouml;d T&Uuml; robotiklubi liikmetega ka tulevikus.
T&auml;nan meeskonnakaaslasi toreda kogemuse eest!
[redigeeri] Harti


Harti LED-ide ja vooluplaati s&ouml;&ouml;vitamas
Olen Robotexil osalemisega saanud osavamaks, hoolsamaks ja t&auml;psemaks. Ehk siis sel aastal ei tekkinud jootmispraaki. K&otilde;ik komponendid said kohe esimesel korral &otilde;iget pidi ning t&auml;pselt sinna kuhu vaja.
Sel aastal oli v&auml;ljak t&auml;iesti uus ja pehmem kui mullu ja roboti liikumine raskem ning meie robot liikus &uuml;pris aeglaselt. Meie kasutatud kolme omnirattaga alusvankril on see puudus, et otse liikumisel veavad kolmest rattast ainult kaks. Nelja omnirattaga robotil veaks igas suunas s&otilde;ites k&otilde;ik rattad. Kuna mehaanikat ringi teha ja uusi mootoreid osta me ei tahtnud, siis katsusin olemasolevaid kombineerides maksimumi saada. Panin esimesteks k&otilde;ige kiiremad mootorid.
Me oleks pidanud mootoriplaadi koodi p&auml;ris nullist uuesti kirjutama, sest see oli meile k&otilde;igile v&otilde;&otilde;ras kood, seal olid vead sees ning minu kui mitte programmeerija jaoks oli ta t&auml;iesti loetamatu. Meil oli nii, et mina sain aru liikumise algoritmidest ning PIDist japrogrammeerijad said aru meie koodist. Niisiis pidime tegema nii, et need arusaamised roboti ehitamisel otstarbekalt &auml;ra kasutatud saaksid.
Meie roboti liikumise PIDiga oli kogu aeg probleeme, ikka ja j&auml;lle tegime seda paremaks ja siis tundus, et on hea ning eelv&otilde;istlusel oleks muidu v&otilde;inud rahule j&auml;&auml;da, kui robot poleks joone taha kinni j&auml;&auml;nud. Selles oli s&uuml;&uuml;di 2 asja. Esiteks see, et PIDi integraal komponent on liiga v&auml;ike, takistuse taha kinni j&auml;&auml;des, ei l&auml;inud PWM piisavalt kiiresti maksimumi ja teiseks ei olnud aku t&auml;iesti t&auml;is. P&auml;ris t&auml;is akuga oleks ta sealt jaksanud &auml;ra s&otilde;ita.
Niisiis tuli veel liikumist seadistada ning seda me tegime, saime T&otilde;nisega roboti nii v&auml;ledaks, et lust vaadata. Liikus kiiresti ja j&otilde;nksutamata igas soovitud suunas, kuid paraku polnud see kiire liikumine koosk&otilde;las roboti AI-ga ning Raimondil polnud ka aega AI-d &uuml;le vaadata ja teda uute kiirustega sobitada.
Robot ei saanud t&auml;pselt selline, nagu joonisel. Punaseid klambreid arvuti hoidmiseks ei tulnud. Tuli 2 kruvi alla serva ja need tegid arvuti hoidmise t&ouml;&ouml; piisavalt h&auml;sti &auml;ra.
Robotexi &uuml;le kodus j&auml;rele m&otilde;eldes sai mulle selgeks, et ei saa j&auml;&auml;da s&otilde;ltuma aku pingest, see k&otilde;igub vahemikus 12,6 - 10 V ning seega ka roboti maksimum kiirus vastavalt 0,75 - 0,3 m/s. Mul on &uuml;ks l&auml;paka laadija autosse, e pingeadapter millega saab muundada 11..20V alalispinget 6 .. 24V alalispinget. Nii oleks olemasoleva aku pingest s&otilde;ltumatult saanud panna meie roboti mootorid t&ouml;&ouml;le stabiilselt n&auml;iteks 14V-ga ja tulemuseks oleks olnud stabiilselt v&auml;le jalgpallur. Siit ka siis ettepanek selleks, kuidas meie robotit paremini teha, kui meie tegime, stabiliseerige k&otilde;ik pinged, mitte ainult +5V vaid ka mootorite toide ja v&otilde;ibolla ka +12V. Kasutage pigem nelja, kui kolme omniratast.

Robotex on &uuml;likooli parim aine, sellest siin &otilde;pib palju rohkem, kui tavaliste loengute-seminaride k&auml;igus. Selle aasta &otilde;nnestumised oli motiveerivad ka edaspidi katsetama.
[redigeeri] T&otilde;nis


T&otilde;nis Robini ja Martiga Robotexil
Robotex'ks valmistumisel &otilde;ppisin, et on v&auml;ga t&auml;htis pidevalt testida muudatusi, mida l&auml;bi viid. V&auml;ga t&auml;htis on koost&ouml;&ouml; meeskonnaga. Kui on probleeme &uuml;lesannetest aru saamisega siis tuleb kindlasti k&uuml;sida. Kui on probleeme &uuml;lesande lahendamisel siis tuleb kindlasti abi paluda. Kui on probleeme julgusega teistelt k&uuml;sida siis tuleb l&otilde;vikonservi s&uuml;&uuml;a (loe: tuleb v&otilde;tta julgus kokku) ja minna ning k&uuml;sida. Vaatamata sellele, et esialgu v&otilde;ivad T&Uuml; Robotiklubi inimesed j&auml;tta endast kinnise mulje, siis nii see tegelikult ei ole, kui on asjalik k&uuml;simus ning nad oskavad aidata, siis seda nad ka teevad. Kui on rumal k&uuml;simus,siis k&uuml;si ikka, natukene naeravad sinu &uuml;le, kuid aitavad ikka kui aru saavad, et sinu jaoks on asi ebaselge.
Lisaks &otilde;ppisin programmeerima ATmega mikrokontrollereid ArduinoIDE abil, mis kasutab peamiselt C++ ja C keelt. Natukene &otilde;ppisin ka progema tarkvara poolt, t&auml;psemalt GUI poolt, mis kasutas C# keelt. &Otilde;ppisin natukene l&auml;hemalt, mis asi on PID ning, milleks seda kasutatakse. Raimondi abiga sain enam-v&auml;hem selgeks, mida teeb Forward Kinematics ja Inverse Kinematics. Sain teada &uuml;he otstarbe magnetanduritele. &Otilde;ppisin kasutama elektroonilist g&uuml;roskoopi. &Otilde;ppisin, et mitte mingil juhul ei tohi puutuda kruvikeeraja otsaga korraga vastu m&auml;hise juhet ja coilguni plaati. Google ja datasheedid on sinu parimad s&otilde;brad. V&auml;ga kasulik on pidada blogi, kirjuta k&otilde;ik &uuml;les, mida teinud ja avastanud oled seoses oma robotiga. Sinu blogist saavad hea &uuml;levaate sinu meeskonnakaaslased ja v&otilde;ivad leida abi tesite meeskondade liikmed.
K&otilde;ige t&auml;htsam, mida &otilde;ppisin:
&Auml;ra kunagi j&auml;&auml; hiljaks oma osaga meeskonnat&ouml;&ouml;st
Kui oled oma osa meeskonnat&ouml;&ouml;st enneaegselt &auml;ra teinud, k&uuml;si kas teistel meeskonnaliikmetel on ehk abi vaja
Kui teiste meeskondade liikmed on j&auml;nnis ning paluvad sinu abi, siis &auml;ra ole kitsi ning aita, kuid &auml;ra j&auml;ta ennast ajalisse h&auml;tta
Kuula, mida vanemad olijad r&auml;&auml;givad, nad on seda k&otilde;ike juba teinud, mitu korda
Kui teed midagi esimest korda, kindlasti k&uuml;si laboris olijatelt enne abi, et kuidas ja mida mille jaoks kasutada, igas valdkonnas (mehaanika, programmeerimine, elektroonika jne.)
[redigeeri] Soovitusi ja m&otilde;tteid

K&otilde;ige olulisem on v&otilde;imalikult vara j&otilde;uda v&auml;ljaku peale. Selleks ei pea k&otilde;ik (v&otilde;i kohati ka mitte enamik) koodi valmis olema. Kasv&otilde;i n&auml;iteks l&ouml;&ouml;gimehhanismi valmides saab minna v&auml;ljakule ja teha kindlaks, kui paljudest voltidest piisab, et pall l&uuml;&uuml;a &uuml;hest v&auml;ljaku &auml;&auml;rest teiselpool asuvasse v&auml;ravasse. Ka liikumisloogika juures saab k&otilde;igepealt teha n&auml;iteks otse s&otilde;itmise, seej&auml;rel nurga all s&otilde;itmise, seej&auml;rel p&ouml;&ouml;ramise, seej&auml;rel erinevate kiirustega nende tegemine.
Reaalses olukorras testimine on oluline, et selgeks teha vigu, mida mujal pole n&auml;ha. Meil toimus olude t&otilde;ttu pildit&ouml;&ouml;tluse tegemine videofaili p&otilde;hjal. Reaalse kaamerast tuleva pildi peale algoritmi laskmine t&otilde;i v&auml;lja probleeme, mida videofaili t&ouml;&ouml;tlemisel polnud. N&auml;iteks n&uuml;anss, et kaadrid tulid aeglasema sagedusega. Sama p&otilde;him&otilde;ttega on soovitus, et kogu arendus v&otilde;iks toimuda v&otilde;imalikult sarnastel platvormidel. Kui roboti peal on Linux, siis koodi kirjutamine Windowsi all v&otilde;ib p&otilde;hjustada koodi, mida on vaja p&auml;rast portida (ajakulu), sest too ei t&ouml;&ouml;ta enam samamoodi.


L&ouml;&ouml;gimehhanismi Plaadi kahjustus
Laboris olles v&otilde;iks &uuml;ritada aega kasutada v&otilde;imalikult optimaalselt. Eriti siis, kui roboti juures on vaja teha asju, millega on kiire (t&auml;htajad m&ouml;&ouml;das, teised ootavad nende j&auml;rgi). Esimest korda tulijatel v&otilde;ib juhtuda, et teiste robotiehitajatega sotsialiseerumise peale l&auml;heb rohkem aega kui m&otilde;istlik.
Roboti sees on terve mikrouniversum ja seet&otilde;ttu tuleks olla eriti ettevaatlik, kui minna kruvikeeraja v&otilde;i kasv&otilde;i n&auml;puga robotit seestpoolt mudima. Meil k&uuml;ll &otilde;nneks kriitilisi kahjustusi roboti sisemisele mikrouniversumile ei tekkinud, kuid juhtus, et kruvikeeraja otsaga sai L&ouml;&ouml;gimehhanismi Plaati must laik kogemata k&otilde;rvetatud v&otilde;i siis suure kondensaatori k&uuml;ljest s&auml;rtsu jm.
Samamoodi tuleb ettevaatlik olla juhtmete &uuml;hendamisel. Soovitan endiselt kasutada juhtmete juures mingit s&uuml;steemi. Kui n&auml;iteks rohelisi, punaseid ja siniseid valgusdioode kontrollivad juhtmed, mis on rohelist, punast ja sinist v&auml;rvi, siis annab v&auml;ga palju juurde see, kui valgusdioodide ja juhtmete v&auml;rvide vahel on vastavus. K&otilde;ige minimaalsem on see, et +5, +12, +X voldi traat on punane ja maanduse traat on must. Hea lahendus on see, kui igale erinevale traadile on antud konkreetne ja kindel v&auml;rv ning see on kuskil dokumenteeritud. Stiilis MISO - oranž, MOSI - roheline, SCK - sinine vms.


Robini k&uuml;lgedel olevad LED-ribad p&otilde;levad valgelt - Robin on haaranud palli ja v&auml;ravale tsentreerinud ennast, kohe rakendub l&ouml;&ouml;gimehhanism.
Elektroonikaplaate disainides on ka vajalik &uuml;htne stiil. N&auml;iteks, et +5V traadid j&auml;&auml;vad alati plaadi l&auml;himate servade poole k&otilde;ikidel pistikutel. Sellised detailid v&auml;hendavad oluliselt vigu, et juhtmed &uuml;hendatakse tagurpidi ja selle t&otilde;ttu p&otilde;leb midagi plaadil l&auml;bi v&otilde;i ei t&ouml;&ouml;ta ning kulub tunde vea selgekstegemisele.
On hea hoida varu elektroonikaseadmetest. T&otilde;en&auml;oline, et n&auml;iteks Mootorite Plaati ei pruugi olla aega teha kaks t&uuml;kki, kuid n&auml;iteks eelmine aasta tehtud lisa magnetandur koos plaadiga oli sellel aastal asendamatuks abiks. Asendada oleks ainult saanud uue magnetanduri ja plaadi tellimine, mis oleks v&otilde;tnud hulganisti aega ja raha.
Roboti tagasiside on hea teha v&otilde;imalikult mugavaks. V&auml;ga palju annab juurde, kui robot helendab (v&otilde;i v&auml;hemalt p&otilde;leb temal kasv&otilde;i &uuml;ks valgusdiood) erinevat v&auml;rvi, kui robot teeb v&auml;ljakul erinevaid toiminguid. Niimoodi on lihtne aru saada, kas robot ajab mingit palli taga v&otilde;i otsib alles palli v&otilde;i teeb mingit kolmandat programmeeritud tegevust. Ka heliline tagasiside on hea justnimelt olulisemate v&otilde;tmekohtade juures roboti autonoomsel k&auml;itumisel. V&auml;ga mugav ja kasulik on reaalajas j&auml;lgida loetaval kujul k&otilde;rgema ja madala taseme vahel vahetatavaid k&auml;ske / pakette. Samuti n&auml;ha pildit&ouml;&ouml;tluse erinevaid kanaleid ja vahetulemusi.
Kuna &otilde;ige testimise jaoks peaks r&uuml;peraal asuma roboti peal, siis aitab TeamViewer n&auml;ha, mis r&uuml;peraali sees toimub. Hoiatus: Antud programm v&otilde;tab kohati p&auml;ris palju resurssi. Sellegipoolest v&otilde;ib tegu olla lihtsama, kiirema ja m&otilde;nes m&otilde;ttes optimaalsema lahendusega, kui n&auml;iteks sinihamba v&otilde;i WiFi kaudu septsiaalselt ise programmeeritud infovahetus m&otilde;ne v&auml;lise spetsiaalselt ise programmeeritud tarkvaraga.
Igasuguste sleep(...) k&auml;skudega tuleb olla ettevaatlik, sest roboti jaoks on oluline, et programm t&ouml;&ouml;taks v&otilde;imalikult kiiresti ja optimaalselt. Sleep() aga seiskab t&auml;ielikult konkreetse l&otilde;ime, millesse ta on pandud. Esialgse testimise jaoks v&otilde;ib seda olla lihtne ja kiire kasutada, kuid ei maksa &auml;ra unustada hiljem see k&auml;sk 90%-l kohtadest &auml;ra v&otilde;tta. Meie soovitame kasutada taimereid (teha midagi, kui teatud arv millisekundeid on m&ouml;&ouml;dunud) ja evente (v&auml;liste s&uuml;ndmuste peale kutsutavad v&auml;ljakutsed).
N&auml;ide, mida me m&otilde;tleme taimeri all:
private long escapeTheWallTimeout = 0;
(...)
//Juhul, kui on vaja minna EscapeTheWall olekusse
stateMachine.Configure(State.EscapeTheWall)
   .Permit(Trigger.WallEscaped, State.LookingForBall)
   .Permit(Trigger.PoweredDown, State.Idle)
   .OnEntry(() =>
   {
      Commander.Stop();
      if (SensorData.BallInDribbler) {
           //M&auml;&auml;rame seina &auml;&auml;rest p&otilde;genemise ajaks 1 sekundi
           this.escapeTheWallTimeout = stopwatch.ElapsedMilliseconds + 1000;
      } else {
           //M&auml;&auml;rame seina &auml;&auml;rest p&otilde;genemise ajaks 2.25 sekundit
           this.escapeTheWallTimeout = stopwatch.ElapsedMilliseconds + 2250;
      }
   });
 (...)
 //EscapeTheWall oleku funktsionaalsus
 private void EscapeTheWall() {
    //Kui meie seina &auml;&auml;rest p&otilde;genemise aeg on l&auml;bi, siis l&auml;hme olekust v&auml;lja
    if (escapeTheWallTimeout < stopwatch.ElapsedMilliseconds) {
       stateMachine.Fire(Trigger.WallEscaped);
       Console.WriteLine("Wall escaped");
    }
    //Muul juhul on keerulisem loogika. Vastavalt sensorite andmetele v&otilde;ib n&auml;iteks pool sekundit tagurdada ja
    //pool sekundit paremale p&ouml;&ouml;rata. 
    //Sealjuures v&otilde;rreldes stopwatch.ElapsedMilliseconds ja escapeTheWallTimeout vahet soovitava ajavahemikuga
    (...)
 }
[redigeeri] Robotex



Where brains and metal meet...
Seda, kuidas meil Robotexil l&auml;ks on k&otilde;ige parem lugeda vastavalt blogisissekandelt. Siinkohal v&otilde;iks mainida, et l&auml;ks suhteliselt keskmiselt. Tartu eelv&otilde;istlusel olime p&auml;ris edukad ja v&otilde;ib-olla oleks v&otilde;itnud, kui Raimond ei oleks unustanud paaril korral valida kasutajaliidesest &otilde;iget vastase v&auml;ravat (v&otilde;i siis t&ouml;&ouml;tanud palli &auml;ral&ouml;&ouml;mine kindla aja m&ouml;&ouml;dudes). Samas k&otilde;ik selle aasta Tartu robotid olid meie meelest v&auml;ga tasav&auml;gised ja nendevahelist paremusj&auml;rjestust m&auml;&auml;ras t&otilde;en&auml;oliselt k&otilde;ige rohkem &otilde;nnefaktor.
Robotexil saime aga umbes 8nda koha. Kuna robotex.ee lehel ei ole praeguse seisuga endiselt turniiritabelit &uuml;leval (v&otilde;i on v&auml;ga h&auml;sti &auml;ra peidetud), siis ei saa kindlalt &ouml;elda. &Uuml;hes&otilde;naga l&auml;ks paremini kui eelmisel aastal (mil me ei suutnud nurgast v&auml;ljagi liikuda). Selle edu v&otilde;ti oli t&otilde;en&auml;oliselt v&auml;ikesed eesm&auml;rgid, samm-sammult asjade tegemine ja pidev testimine. Taktika, et k&otilde;igepealt proovime sirgelt otse liikuda, seej&auml;rel p&ouml;&ouml;rata, siis alles vaatame kiirusi ja muude nurkade all s&otilde;itmist.
K&otilde;ige suuremateks muredeks j&auml;id kaamerapildi udustumine madala FPS-i t&otilde;ttu, mille lahendust (60 FPS-i saamine) me ei j&otilde;udnud viimastel p&auml;evadel &auml;ra likvideerida, ja v&auml;hene testimine. V&auml;ikeste sammude kaupa funktsionaalsuse implementeerimine, testimine ja parandamine tagasid k&uuml;ll keskp&auml;rase hea progressi, kuid edukama lahenduse jaoks j&auml;i aega puudu. Aeg kulus p&otilde;hiliselt madala taseme funktsionaalsuse implementeerimisele, mille puhul alguses eeldasime, et see valmib kiiremini. Selle taga ootas aga k&otilde;rgema taseme funktsionaalsuse t&auml;iustused, sest kui Mootorite Plaadis muudeti n&auml;iteks PID-i parameetreid, siis v&otilde;is juhtuda, et roboti s&otilde;idukiirus 50% oli natuke kiirem v&otilde;i aeglasem ja seega k&otilde;rgema taseme poolt etteantavaid man&ouml;&ouml;vreid oli vaja iga kord uuesti &uuml;le testida ja parandada.
&Uuml;ldiselt eks k&otilde;ik meeskonnaliikmed &uuml;ritasid anda endast parimat ja omandasid kogu projekti v&auml;ltel uusi teadmisi ning oskusi. Samuti t&auml;itsime eesm&auml;rgi saada Robin v&auml;ljaku nurgast v&auml;lja s&otilde;itma ja palle v&auml;ravasse l&ouml;&ouml;ma. Nendes m&otilde;tetes v&otilde;ib projekti meie poolt lugeda edukaks.
</body>
</html>